﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using DataAccessComponents;
using BusinessLogicLayer;

namespace inzDesktop
{
    /// <summary>
    /// Interaction logic for windowDodajRezerwacje.xaml
    /// </summary>
    public partial class windowDodajRezerwacje : Window
    {
        public Pracownik pracownikZalogowany { get; set; }

        public windowDodajRezerwacje()
        {
            InitializeComponent();
            inicjalizujZawartosc();

            // czyszczenie tb z terminem
            tbTermin.Text = tbTerminSC.Text = "";
        }
        public void inicjalizujZawartosc()
        {
            Rezerwacja rezerwacja = new Rezerwacja();
            rezerwacja.Czy_zmiana = false;
            this.DataContext = rezerwacja;

            DodatkoweUslugiBL duBL = new DodatkoweUslugiBL();
            dataGridDodatkoweUslugi.ItemsSource = duBL.pobierzListe();
        }

        private void tiKlienci_Loaded(object sender, RoutedEventArgs e)
        {        
                   
            // Czyszczenie listy pozycji do usunięcia
            //klientRezerwacjaDoUsuniecia.Clear();
        }      

        private void btnWybierzHotel_Click(object sender, RoutedEventArgs e)
        {
            windowZmienHotel wzh = new windowZmienHotel();
            wzh.ShowDialog();

            if (wzh.DialogResult.Value == true)
            {
                Rezerwacja rezerwacja = (Rezerwacja)this.DataContext;
                rezerwacja.Termin.Oferta.Hotel = wzh.Hotel;
                tbHotel.Text = wzh.Hotel.Nazwa;
                tbHotelSC.Text = wzh.Hotel.Nazwa;
                this.DataContext = rezerwacja;
            }
        }

        private void btnOK_Click(object sender, RoutedEventArgs e)
        {
            
            if (Validacja.IsValid(LayoutRoot))
            {
                System.Windows.MessageBoxResult wynik = System.Windows.MessageBox.Show("Czy zapisać zmiany?", "Uwaga!", MessageBoxButton.YesNoCancel, MessageBoxImage.Question);
                if (wynik == MessageBoxResult.Yes)
                {
                    zapiszZmianyRezerwacja();
                    
                    this.Close();
                }
                else if (wynik == MessageBoxResult.No)
                {
                    this.Close();
                }
            }
            else
                 MessageBox.Show("Wprowadzone zostały niepoprawne dane.", "Błąd", MessageBoxButton.OK, MessageBoxImage.Error);
        }

        private void zapiszZmianyRezerwacja()
        {
            RezerwacjaBL rezerwacjaBL = new RezerwacjaBL();
            Rezerwacja rezerwacja = this.DataContext as Rezerwacja;
            rezerwacja.Id_oddzial = pracownikZalogowany.Id_oddzial;

            int id_rezerwacji = rezerwacjaBL.dodaj(rezerwacja);
            zapiszKlientowRezerwacji(id_rezerwacji);
                       

            //Zczytywanie usług dodatkowych
            string uslugi=string.Empty;
            ObservableCollection<DodatkoweUslugi> lista = dataGridDodatkoweUslugi.ItemsSource as ObservableCollection<DodatkoweUslugi>;
            foreach (DodatkoweUslugi du in lista)
            {
                if (du.Zaznaczony == true)
                {
                    uslugi += string.Format("\n{0}({1:N})",du.Nazwa,du.Cena);
                }
            }
            rezerwacja.Dodatkowe_uslugi = uslugi;
            
            //Nadawanie numery rezerwacji
            rezerwacja.Id_rezerwacja = id_rezerwacji;
            rezerwacja.Numer_rezerwacji = String.Format("R-{0}-{1}", DateTime.Now.Year, id_rezerwacji);
            rezerwacjaBL.aktualizuj(rezerwacja);
        }

        private void zapiszKlientowRezerwacji(int idrezerwacji)
        {
            Klient_RezerwacjaBL klient_rezerwacjaBL = new Klient_RezerwacjaBL();

            ObservableCollection<Klient_Rezerwacja> klienciRezerwacja = dataGridListaKlientow.ItemsSource as ObservableCollection<Klient_Rezerwacja>;
            foreach (Klient_Rezerwacja kr in klienciRezerwacja)
            {
                kr.Id_rezerwacja = idrezerwacji;
            }

            klient_rezerwacjaBL.aktualizujListe(klienciRezerwacja);

            // usuwanie wpisów
          //  klient_rezerwacjaBL.usun(klientRezerwacjaDoUsuniecia);
        }

        private void btnAnuluj_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }      

        private void btnWybierzTermin_Click(object sender, RoutedEventArgs e)
        {
            windowListaTerminow wlt = new windowListaTerminow();
            Rezerwacja rezerwacja = (this.DataContext as Rezerwacja);

            wlt.inicjalizujZawartosc(rezerwacja.Termin.Oferta.Id_oferta);
            wlt.ShowDialog();

            if (wlt.DialogResult.Value == true)
            {
                Oferta oldOferta = rezerwacja.Termin.Oferta;

                rezerwacja.Termin = wlt.Termin;
                rezerwacja.Id_termin = wlt.Termin.Id_termin;

                rezerwacja.Termin.Oferta = oldOferta;

                string term = String.Format("{0:dd-MM-yyyy} - {1:dd-MM-yyyy}", rezerwacja.Termin.Data_rozpoczecia, rezerwacja.Termin.Data_zakonczenia);
                tbTermin.Text = term;
                tbTerminSC.Text = term;
            }
        }

        private void btnDodajNowego_Click(object sender, RoutedEventArgs e)
        {
            windowDodajKlienta wdk = new windowDodajKlienta();
            wdk.inicjalizujZawartosc(true);
            wdk.ShowDialog();

            if (wdk.DialogResult.Value == true)
            {
                ObservableCollection<Klient_Rezerwacja> klienciRezerwacja = dataGridListaKlientow.ItemsSource as ObservableCollection<Klient_Rezerwacja>;

                // Tworzenie obiektu do tabeli Klient_rezerwacj
                Klient_Rezerwacja kr = new Klient_Rezerwacja();
                Rezerwacja rezerwacja = this.DataContext as Rezerwacja;
                StatusBL statusBL = new StatusBL();

                kr.Id_klient = wdk.Klient.Id_klient;
                kr.Klient.Id_klient = wdk.Klient.Id_klient;
                kr.Klient = wdk.Klient;
                kr.Id_rezerwacja = rezerwacja.Id_rezerwacja;
                kr.Id_status = wdk.Status.Id_status;
                // Pobieranie statusu
                kr.Status = wdk.Status;

                klienciRezerwacja.Add(kr);

                dataGridListaKlientow.ItemsSource = klienciRezerwacja;
            }
        }

        private void btnDodajIstniejacegoKlienta_Click(object sender, RoutedEventArgs e)
        {
            windowListaKlientow wlk = new windowListaKlientow();
            wlk.inicjalizujZawartosc();

            wlk.ShowDialog();

            if (wlk.DialogResult.Value == true)
            {
                ObservableCollection<Klient_Rezerwacja> klienciRezerwacja = dataGridListaKlientow.ItemsSource as ObservableCollection<Klient_Rezerwacja>;

                // Sprawdzanie czy klient nieznajduje się już na liście
                bool czy_juz_jest = false;
                foreach (Klient_Rezerwacja klient in klienciRezerwacja)
                {
                    if (klient.Klient.Id_klient == wlk.Klient.Id_klient)
                    {
                        czy_juz_jest = true;
                        MessageBox.Show("Wybrany klient znajduje się już na liście", "Uwaga", MessageBoxButton.OK, MessageBoxImage.Warning);
                        break;

                    }
                }

                if (czy_juz_jest == false)
                {
                    // Tworzenie obiektu do tabeli Klient_rezerwacj
                    Klient_Rezerwacja kr = new Klient_Rezerwacja();
                    Rezerwacja rezerwacja = this.DataContext as Rezerwacja;
                    StatusBL statusBL = new StatusBL();

                    kr.Id_klient = wlk.Klient.Id_klient;
                    kr.Klient.Id_klient = wlk.Klient.Id_klient;
                    kr.Klient = wlk.Klient;
                    kr.Id_rezerwacja = rezerwacja.Id_rezerwacja;
                    kr.Id_status = wlk.Status.Id_status;
                    // Pobieranie statusu
                    kr.Status = wlk.Status;

                    klienciRezerwacja.Add(kr);

                    dataGridListaKlientow.ItemsSource = klienciRezerwacja;
                }
            }

        }

        private void buttonSzczegoly_Click(object sender, RoutedEventArgs e)
        {
            // Tworzenie obiektu nowego okna                      
            windowSzczegolyKlienta window = new windowSzczegolyKlienta();
            Klient_Rezerwacja zaznaczonyKlient = (Klient_Rezerwacja)dataGridListaKlientow.SelectedItem;

            // Przekazywanie idklienta do nowego okna
            window.inicjalizujZawartosc(zaznaczonyKlient.Klient.Id_klient);
            window.Show();
        }

        private void buttonUsun_Click(object sender, RoutedEventArgs e)
        {

            Klient_Rezerwacja klientR = dataGridListaKlientow.SelectedItem as Klient_Rezerwacja;
            if (klientR.Id_status != 1)
            {
                //klientRezerwacjaDoUsuniecia.Add(klientR);

                // Usuniecie z dataGrid
                ObservableCollection<Klient_Rezerwacja> listaKlientRezerwacja = dataGridListaKlientow.ItemsSource as ObservableCollection<Klient_Rezerwacja>;
                listaKlientRezerwacja.Remove(klientR);
                dataGridListaKlientow.ItemsSource = listaKlientRezerwacja;
            }
            else
            {
                MessageBox.Show("Niemożna usunąć klienta rezerwującego z listy", "Uwaga", MessageBoxButton.OK, MessageBoxImage.Warning);
            }
        }

        private void btnWybierzOferte_Click(object sender, RoutedEventArgs e)
        {
            windowListaOfert wlo = new windowListaOfert();
            wlo.ShowDialog();

            if (wlo.DialogResult.Value == true)
            {
                Rezerwacja rezerwacja = this.DataContext as Rezerwacja;

                // Gdy oferta wybrana, uaktywnianie przycisku wybierzTermin
                btnWybierzTermin.IsEnabled = true;

                // Ustawianie pierwszego wolnego terminu z oferty
                TerminBL terminBL = new TerminBL();
                ObservableCollection<Termin> listaTermin = terminBL.pobierzListe(wlo.Oferta.Id_oferta);
                foreach (Termin termin in listaTermin)
                {
                    if (termin.Data_rozpoczecia >= DateTime.Now)
                    {
                        rezerwacja.Termin = termin;
                        rezerwacja.Id_termin = termin.Id_termin;
                        string term = String.Format("{0:dd-MM-yyyy} - {1:dd-MM-yyyy}", rezerwacja.Termin.Data_rozpoczecia, rezerwacja.Termin.Data_zakonczenia);
                        tbTermin.Text = term;
                        tbTerminSC.Text = term;
                    }
                    else
                    {
                        tbTermin.Text = "Brak terminów";
                        tbTerminSC.Text = "Brak terminów";
                    }
                }

                // Przypisywanie do rezerwaci oferty
                rezerwacja.Termin.Oferta = wlo.Oferta;

                tbOferta.Text = tbOfertaSC.Text = wlo.Oferta.Nazwa;

                this.DataContext = rezerwacja;
            }
        }

        private void Grid_Loaded(object sender, RoutedEventArgs e)
        {
            int liczba_doroslych = 0;
            int liczba_dzieci = 0;

            if (dataGridListaKlientow.Items.Count != 0 && dataGridListaKlientow != null)
            {
                ObservableCollection<Klient_Rezerwacja> listaKlientow = dataGridListaKlientow.ItemsSource as ObservableCollection<Klient_Rezerwacja>;
            
                foreach (Klient_Rezerwacja klient in listaKlientow)
                {
                    if (klient.Id_status == 2)
                    {
                        liczba_dzieci += 1;
                    }
                    else if (klient.Id_status == 1 || klient.Id_status == 3)
                    {
                        liczba_doroslych += 1;
                    }
                }
            }
            Rezerwacja rezerwacja = this.DataContext as Rezerwacja;
            rezerwacja.Ilosc_doroslych = liczba_doroslych;
            rezerwacja.Ilosc_dzieci = liczba_dzieci;

            tbLiczbaDoroslych.Text = liczba_doroslych.ToString();
            tbLiczbaDzieci.Text = liczba_dzieci.ToString();

            
        }

        private void btnWybierzRezerwujacy_Click(object sender, RoutedEventArgs e)
        {
            windowListaKlientow wlk = new windowListaKlientow();
            wlk.inicjalizujZawartosc();

            wlk.ShowDialog();
            if (wlk.DialogResult.Value == true)
            {
                Rezerwacja rezerwacja = this.DataContext as Rezerwacja;
                rezerwacja.Id_klient = wlk.Klient.Id_klient;
                rezerwacja.Klient = wlk.Klient;

                tbImie.Text = tbImieSC.Text = wlk.Klient.Imie;
                tbNazwisko.Text = tbNazwiskoSC.Text = wlk.Klient.Nazwisko;                

                tiKlienci.Visibility = Visibility.Visible;
                tbLiczbaDoroslych.Text = "1";
                rezerwacja.Ilosc_doroslych = 1;
                this.DataContext = rezerwacja;


                //Dodawanie do dataGrid klienta

                if (dataGridListaKlientow.Items.Count == 0)
                {
                    ObservableCollection<Klient_Rezerwacja> listaKlientow = new ObservableCollection<Klient_Rezerwacja>();
                    Klient_Rezerwacja kr = new Klient_Rezerwacja();
                    Klient klient = ((Rezerwacja)this.DataContext).Klient;

                    kr.Id_klient = klient.Id_klient;
                    kr.Id_status = 1; // ustawianie jako rezerwojacy
                    kr.Klient = klient;

                    // Pobranie status
                    StatusBL statusBL = new StatusBL();
                    kr.Status = statusBL.pobierz(1);

                    listaKlientow.Add(kr);
                    dataGridListaKlientow.ItemsSource = listaKlientow;
                }
            }
        }

        private void policzKoszty()
        {
            Rezerwacja rezerwacja = this.DataContext as Rezerwacja;
            decimal cena_dorosly = rezerwacja.Termin.Oferta.Cena_dorosly;
            decimal cena_dziecko = rezerwacja.Termin.Oferta.Cena_dziecko;
            int liczba_doroslych = 0;
            int liczba_dzieci = 0;

            if (dataGridListaKlientow.Items.Count != 0 && dataGridListaKlientow != null)
            {
                ObservableCollection<Klient_Rezerwacja> listaKlientow = dataGridListaKlientow.ItemsSource as ObservableCollection<Klient_Rezerwacja>;

                foreach (Klient_Rezerwacja klient in listaKlientow)
                {
                    if (klient.Id_status == 2)
                    {
                        liczba_dzieci += 1;
                    }
                    else if (klient.Id_status == 1 || klient.Id_status == 3)
                    {
                        liczba_doroslych += 1;
                    }
                }
            }



            decimal suma = liczba_doroslych * cena_dorosly + liczba_dzieci * cena_dziecko;

            tbKoszytPokoju.Text = string.Format("{0:N}", suma);


            // zczytywanie dodatkowych uslug
            decimal kosztDodatkoweUslugi = 0;
            ObservableCollection<DodatkoweUslugi> lista = dataGridDodatkoweUslugi.ItemsSource as ObservableCollection<DodatkoweUslugi>;
            foreach (DodatkoweUslugi du in lista)
            {
                if (du.Zaznaczony == true)
                {
                    kosztDodatkoweUslugi += du.Cena;
                }
            }
            tbDodatkowUslugi.Text = string.Format("{0:N}", kosztDodatkoweUslugi);

            // Wypisywanie całkowitego kosztu
            tbWartoscRezerwacji.Text = string.Format("{0:N}", kosztDodatkoweUslugi + suma);

            rezerwacja.Cena_dodatkowe = kosztDodatkoweUslugi;
            rezerwacja.Wartosc = kosztDodatkoweUslugi + suma;
            this.DataContext = rezerwacja;
        }

        private void gridSkladnikCeny_Loaded(object sender, RoutedEventArgs e)
        {
            policzKoszty();
        }

        private void cbZaznaczWszystkieUslugi_Checked(object sender, RoutedEventArgs e)
        {
            ObservableCollection<DodatkoweUslugi> listaUslug = dataGridDodatkoweUslugi.ItemsSource as ObservableCollection<DodatkoweUslugi>;
            foreach (DodatkoweUslugi du in listaUslug)
            {
                du.Zaznaczony = true;
            }
            dataGridDodatkoweUslugi.ItemsSource = listaUslug;
        }

        private void cbZaznaczWszystkieUslugi_Unchecked(object sender, RoutedEventArgs e)
        {
            ObservableCollection<DodatkoweUslugi> listaUslug = dataGridDodatkoweUslugi.ItemsSource as ObservableCollection<DodatkoweUslugi>;
            foreach (DodatkoweUslugi du in listaUslug)
            {
                du.Zaznaczony = false;
            }
            dataGridDodatkoweUslugi.ItemsSource = listaUslug;
        }

        private void dataGridDodatkoweUslugi_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
        {
            bool zaznaczony = ((DodatkoweUslugi)dataGridDodatkoweUslugi.SelectedItem).Zaznaczony;
            if (zaznaczony == true)
            {
                ((DodatkoweUslugi)dataGridDodatkoweUslugi.SelectedItem).Zaznaczony = false;
            }
            else
                ((DodatkoweUslugi)dataGridDodatkoweUslugi.SelectedItem).Zaznaczony = true;
        }

        private void btnDodajNowegoRezerwujacego_Click(object sender, RoutedEventArgs e)
        {
            windowDodajKlienta wdk = new windowDodajKlienta();
            wdk.ShowDialog();

            if (wdk.DialogResult.Value == true)
            {
                ObservableCollection<Klient_Rezerwacja> klienciRezerwacja = dataGridListaKlientow.ItemsSource as ObservableCollection<Klient_Rezerwacja>;

                // Tworzenie obiektu do tabeli Klient_rezerwacj
                Klient_Rezerwacja kr = new Klient_Rezerwacja();
                Rezerwacja rezerwacja = this.DataContext as Rezerwacja;
                StatusBL statusBL = new StatusBL();

                kr.Id_klient = wdk.Klient.Id_klient;
                kr.Klient.Id_klient = wdk.Klient.Id_klient;
                kr.Klient = wdk.Klient;
                kr.Id_rezerwacja = rezerwacja.Id_rezerwacja;
                kr.Id_status = wdk.Status.Id_status;
                // Pobieranie statusu
                kr.Status = wdk.Status;

                klienciRezerwacja.Add(kr);

                dataGridListaKlientow.ItemsSource = klienciRezerwacja;
            }
        }      
    }
}
